package com.example.demo.common;

import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.util.DigestUtils;
import org.springframework.util.StringUtils;

import java.nio.charset.StandardCharsets;
import java.util.UUID;

/*
* 密码工具类：
* 加盐加密    加盐解密*/
public class PasswordTools {

    //加盐加密    明文密码   加盐加密的密码
    public static String encrypt(String password) {
        //1.产生盐值
        String salt = UUID.randomUUID().toString().replace("-","");
        //2.使用盐值 + 明文密码 得到加密的密码
        String finalPassword = DigestUtils.md5DigestAsHex((salt + password).getBytes());
        //3. 将盐值和加密的密码共同返回（保证盐值和加密密码）
        String dbPassword = salt + "$" + finalPassword;
        return dbPassword;
    }

    /*password: 明文密码
    * salt：盐值
    * return：加盐机密的密码*/
    public static String encrypt(String password, String salt) {
        //1.使用盐值 + 明文密码 得到加密的密码
        String finalPassword = DigestUtils.md5DigestAsHex((salt + password).getBytes());
        //2. 将盐值和加密的密码共同返回（保证盐值和加密密码）
        String dbPassword = salt + "$" + finalPassword;
        return dbPassword;
    }

    /*验证加盐加密密码
    * password：明文密码（不一定对，需要验证明文密码）
    * dbPassword：数据库存储的密码（包含：salt + $ +加盐加密密码 ）
    * true：密码正确*/
    public static boolean decrypt(String password,String dbPassword) {
        boolean result = false;
        if (StringUtils.hasLength(password) && StringUtils.hasLength(dbPassword) &&
        dbPassword.length() == 65 && dbPassword.contains("$")) {
            //参数正确
            //1. 得到盐值
            String[] passwordArr = dbPassword.split("\\$");
            //1.1盐值
            String salt = passwordArr[0];
//            //1.2得到正确密码的加盐加密密码
//            String finalPassword = passwordArr[1];
            //2.生成验证密码的加盐加密密码
            String checkPassword = encrypt(password, salt);
            if (dbPassword.equals(checkPassword)) {
                result = true;
            }
        }
        return result;
    }
    public static void main(String[] args) {
        BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
        String password = "123456";
        String dbPassword1 = passwordEncoder.encode(password);
        String dbPassword2 = passwordEncoder.encode(password);
        String dbPassword3 = passwordEncoder.encode(password);
//        String dbPassword1 = PasswordTools.encrypt(password);
//        String dbPassword2 = PasswordTools.encrypt(password);
//        String dbPassword3 = PasswordTools.encrypt(password);

        System.out.println(dbPassword1);
        System.out.println(dbPassword2);
        System.out.println(dbPassword3);

        String cPwd = "12345";
        boolean result = passwordEncoder.matches(cPwd, dbPassword1);
        System.out.println("错误的对比结果：" + result);

        boolean result2 = passwordEncoder.matches(password, dbPassword3);
        System.out.println("正确的对比结果：" + result2);
    }
}
